Trabajando datos

Column

Exploración y transformación

De acuerdo con la información de car.names renombrarán las columnas como sigue:

  • buying = vhigh
  • maint = vhigh.1
  • doors = X2
  • persons = X2.1
  • lug_boot = small
  • safety = low
  • clase = unacc

También podemos ver que la distribución de la clase no es normal:

Siendo:

  • unacc = unacceptable (inaceptable)
  • acc = acceptable (aceptable)
  • good = bueno (bueno)
  • v-good = very good (muy bueno)

Los datos no contienen nulos sum(is.na(datos))

[1] 0

Resumén de los datos usando str(datos)

'data.frame':   1727 obs. of  7 variables:
 $ buying  : chr  "vhigh" "vhigh" "vhigh" "vhigh" ...
 $ maint   : chr  "vhigh" "vhigh" "vhigh" "vhigh" ...
 $ doors   : chr  "2" "2" "2" "2" ...
 $ persons : chr  "2" "2" "2" "2" ...
 $ lug_boot: chr  "small" "small" "med" "med" ...
 $ safety  : chr  "med" "high" "low" "med" ...
 $ clase   : chr  "unacc" "unacc" "unacc" "unacc" ...

|| || || ||

Estas variables serán transformadas a factores para su mejor manejo.

'data.frame':   1727 obs. of  7 variables:
 $ buying  : Factor w/ 4 levels "high","low","med",..: 4 4 4 4 4 4 4 4 4 4 ...
 $ maint   : Factor w/ 4 levels "high","low","med",..: 4 4 4 4 4 4 4 4 4 4 ...
 $ doors   : Factor w/ 4 levels "2","3","4","5more": 1 1 1 1 1 1 1 1 1 1 ...
 $ persons : Factor w/ 3 levels "2","4","more": 1 1 1 1 1 1 1 1 2 2 ...
 $ lug_boot: Factor w/ 3 levels "big","med","small": 3 3 2 2 2 1 1 1 3 3 ...
 $ safety  : Factor w/ 3 levels "high","low","med": 3 1 2 3 1 2 3 1 2 3 ...
 $ clase   : Factor w/ 4 levels "acc","good","unacc",..: 3 3 3 3 3 3 3 3 3 3 ...

|| || || ||

Aquí termina el primer análisis y transformación de los datos

Column

Comprendiendo los datos

Porcentajes de las variables

Como podemos ver, las compras tienen una distribución uniforme y todas se mueven alrededor del 25%. Significa que el costo de compra es igual.

Al igual que el precio de compras, el costo de mantenimiento también sigue una distribución uniforme y todas se mueven alrededor del 25%. Significa que el costo de mantenimiento es similar.

De nuevo, vemos una distribución uniform, el costo de mantenimiento también sigue una distribución uniforme y todas se mueven alrededor del 25%. Significa que existen la misma cantidad de vehiculos con diferente número de puertas.

Acá tenemos algo esperado, tenemos el mismo numero de vehiculos en cuanto a capacidad de persosna capaz de llevar.

De misma forma, no varia

Ya ni me tomaré la molestia

Esta parte es verdaderamente interesante, probablemente en esta variable es donde gire el analisis.

Podemos ver que a medida que la clase baja sus observaciones aumenta y a medida que la clase es mejor su porcentaje baja drasticamente a un deplorable 3%.

Nos hace preguntar, esta variable estará relacionada con la seguridad?

Comparativas

Como podemos apreciar, se aprecia claramente que la clase esta relacionada con la seguridad. unacc contiene más vehiculos con seguridad baja, acc contiene vehiculos con seguridad media y alta y por ultimo vgood unicamente tiene vehiculos con seguridad alta.

Otroa gran comparativa sería conocer el numero de personas relacionadas a las puertas

Árboles de clasificación

Antes de arrancar con el árbol, se crearan un training set y un testing set de un 70 y 30 %.

Del ejercicio anterior nos percatamos que teníamos una data bastante inestable, luego de hacer algunas investigaciones encontramos este articulo, por lo que estuvimos investigando formas de dividir nuestros datos y encontramos este otro articulo, en el cual nos dice que:

The function createDataPartition can be used to create balanced splits of the data. If the y argument to this function is a factor, the random sampling occurs within each class and should preserve the overall class distribution of the data. For example, to create a single 80/20% split of the iris data:

Es por lo que esteremos usando este código.

Árbol

Explicación y poda

Como podemos ver, nuestro árbol esta sobredimensionado, es decir es inestable.

Por defecto se poda el árbol considerando cp = 0.01, que puede ser adecuado en muchos casos. Sin embargo, para seleccionar el valor óptimo de este (hiper)parámetro se puede emplear validación cruzada.

En primer lugar habría que establecer cp = 0 para construir el árbol completo, a la profundidad máxima (determinada por los valores de minsplit y minbucket, que se podrían seleccionar “a mano” dependiendo del número de observaciones o también considerándolos como hiperparámetos; esto último no está implementado en rpart, ni en principio en caret)

Posteriormente podemos emplear las funciones printcp() (o plotcp()) para obtener (representar) los valores de CP para los árboles (óptimos) de menor tamaño junto con su error de validación cruzada xerror (reescalado de forma que el máximo de rel error es 1)

Esperemos reducir la anmsiedad al árbol


Classification tree:
rpart(formula = clase ~ ., data = training, method = "class", 
    cp = 0)

Variables actually used in tree construction:
[1] buying   doors    lug_boot maint    persons  safety  

Root node error: 416/1384 = 0.30058

n= 1384 

          CP nsplit rel error  xerror     xstd
1  0.1382212      0   1.00000 1.00000 0.041004
2  0.1093750      2   0.72356 0.72356 0.036892
3  0.0396635      4   0.50481 0.54808 0.033173
4  0.0312500      7   0.38462 0.39904 0.029055
5  0.0216346      9   0.32212 0.36779 0.028042
6  0.0168269     12   0.25721 0.33654 0.026966
7  0.0132212     14   0.22356 0.28606 0.025070
8  0.0096154     16   0.19712 0.23317 0.022830
9  0.0080128     18   0.17788 0.21394 0.021937
10 0.0072115     21   0.15385 0.21154 0.021821
11 0.0024038     25   0.12500 0.18269 0.020373
12 0.0000000     26   0.12260 0.19231 0.020870

Error de validación cruzada (reescalado) dependiendo del parámetro de complejidad CP empleado en el ajuste del árbol de decisión.

La tabla con los valores de las podas (óptimas, dependiendo del parámetro de complejidad) está almacenada en la componente $cptable

            CP nsplit rel error    xerror       xstd
1  0.138221154      0 1.0000000 1.0000000 0.04100369
2  0.109375000      2 0.7235577 0.7235577 0.03689233
3  0.039663462      4 0.5048077 0.5480769 0.03317302
4  0.031250000      7 0.3846154 0.3990385 0.02905469
5  0.021634615      9 0.3221154 0.3677885 0.02804228
6  0.016826923     12 0.2572115 0.3365385 0.02696577
7  0.013221154     14 0.2235577 0.2860577 0.02507018
8  0.009615385     16 0.1971154 0.2331731 0.02283041
9  0.008012821     18 0.1778846 0.2139423 0.02193656
10 0.007211538     21 0.1538462 0.2115385 0.02182139
11 0.002403846     25 0.1250000 0.1826923 0.02037273
12 0.000000000     26 0.1225962 0.1923077 0.02087000

Ahora, podemos seleccionar un valor óptimo mediante el criterio de un error estándar (bibliografía).

          CP       nsplit    rel error       xerror         xstd 
 0.002403846 25.000000000  0.125000000  0.182692308  0.020372733 

Prune

Veamos si ya podemos reducir esa anmsiedad

Estudiando un poco el modelo

Podríamos estudiar el modelo, por ejemplo mediante el método summary(), que entre otras cosas muestra una medida (en porcentaje) de la importancia de las variables explicativas para la predicción de la respuesta (teniendo en cuenta todas las particiones, principales y secundarias, en las que se emplea cada variable explicativa).

  safety  persons    maint   buying lug_boot    doors 
    34.8     18.2     17.7     12.8     12.6      3.9 

safety+buying+persons

safety+maint+persons

safety+buying+maint+persons

Regresión

Matriz de confusión para training

Confusion Matrix and Statistics

          Reference
Prediction acc good unacc vgood
     acc   281    0    21     0
     good   17   56     3     1
     unacc   9    0   944     0
     vgood   1    0     0    51

Overall Statistics
                                         
               Accuracy : 0.9624         
                 95% CI : (0.951, 0.9718)
    No Information Rate : 0.6994         
    P-Value [Acc > NIR] : < 2.2e-16      
                                         
                  Kappa : 0.9194         
                                         
 Mcnemar's Test P-Value : NA             

Statistics by Class:

                     Class: acc Class: good Class: unacc Class: vgood
Sensitivity              0.9123     1.00000       0.9752      0.98077
Specificity              0.9805     0.98419       0.9784      0.99925
Pos Pred Value           0.9305     0.72727       0.9906      0.98077
Neg Pred Value           0.9750     1.00000       0.9443      0.99925
Prevalence               0.2225     0.04046       0.6994      0.03757
Detection Rate           0.2030     0.04046       0.6821      0.03685
Detection Prevalence     0.2182     0.05564       0.6886      0.03757
Balanced Accuracy        0.9464     0.99209       0.9768      0.99001

Matriz de confusión para testing

Confusion Matrix and Statistics

          Reference
Prediction acc good unacc vgood
     acc    70    0    12     0
     good    2   13     1     3
     unacc   2    0   228     0
     vgood   2    0     0    10

Overall Statistics
                                          
               Accuracy : 0.9359          
                 95% CI : (0.9045, 0.9594)
    No Information Rate : 0.7026          
    P-Value [Acc > NIR] : < 2.2e-16       
                                          
                  Kappa : 0.8642          
                                          
 Mcnemar's Test P-Value : NA              

Statistics by Class:

                     Class: acc Class: good Class: unacc Class: vgood
Sensitivity              0.9211     1.00000       0.9461      0.76923
Specificity              0.9551     0.98182       0.9804      0.99394
Pos Pred Value           0.8537     0.68421       0.9913      0.83333
Neg Pred Value           0.9770     1.00000       0.8850      0.99094
Prevalence               0.2216     0.03790       0.7026      0.03790
Detection Rate           0.2041     0.03790       0.6647      0.02915
Detection Prevalence     0.2391     0.05539       0.6706      0.03499
Balanced Accuracy        0.9381     0.99091       0.9632      0.88159

Ajuste de modelo

Para finalizar estamos usando glm, este se usa para ajustar modelos lineales generalizados, especificados dando una descripción simbólica del predictor lineal y una descripción de la distribución de errores.


Call:
glm(formula = safety ~ ., family = quasibinomial, data = training)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-2.2754  -0.9826   0.4668   0.8314   1.6446  

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)    -2.1047     0.3065  -6.868 9.88e-12 ***
buyinglow       0.7391     0.1925   3.840 0.000129 ***
buyingmed       0.5525     0.1812   3.049 0.002340 ** 
buyingvhigh    -0.3119     0.1747  -1.785 0.074531 .  
maintlow        0.3566     0.1909   1.868 0.061962 .  
maintmed        0.2938     0.1848   1.590 0.112157    
maintvhigh     -0.5932     0.1785  -3.323 0.000916 ***
doors3          0.3296     0.1789   1.842 0.065652 .  
doors4          0.3890     0.1805   2.155 0.031342 *  
doors5more      0.4317     0.1783   2.421 0.015622 *  
persons4        1.6865     0.1983   8.505  < 2e-16 ***
personsmore     1.6257     0.1939   8.384  < 2e-16 ***
lug_bootmed    -0.3329     0.1597  -2.085 0.037280 *  
lug_bootsmall  -0.7245     0.1599  -4.531 6.37e-06 ***
clasegood      -0.2235     0.3096  -0.722 0.470443    
claseunacc      2.6812     0.1972  13.598  < 2e-16 ***
clasevgood    -17.2451   319.4129  -0.054 0.956951    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for quasibinomial family taken to be 0.9304794)

    Null deviance: 1747.2  on 1383  degrees of freedom
Residual deviance: 1386.8  on 1367  degrees of freedom
AIC: NA

Number of Fisher Scoring iterations: 15

Gracias